/**
 * 功能说明:
 * 功能作者:
 * 创建日期:
 * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com
 */
package com.sutao.分布式锁.基于zk;

import org.I0Itec.zkclient.ZkClient;

import java.util.concurrent.CountDownLatch;


public abstract class ZookeeperAbstractLock implements ExtLock {
    // 集群连接地址
    protected String CONNECTION = "127.0.0.1:2181";
    // zk客户端连接
    protected ZkClient zkClient = new ZkClient(CONNECTION);
    // path路径
    protected String lockPath = "/path";
    protected CountDownLatch countDownLatch = new CountDownLatch(1);

    public void getLock() {
        if (tryLock()) {
            System.out.println("####获取锁成功######");
        } else {
            // 开启zk监听，如果创建的锁路径存在则让当前线程阻塞，不存在则唤醒当前线程，继续执行后续操作
            waitLock();
            // 当前线程再获取锁，执行相同逻辑
            getLock();
        }
    }

    // 获取锁
    abstract boolean tryLock();

    // 等待锁
    abstract void waitLock();

    public void unLock() {
        if (zkClient != null) {
            System.out.println("#######释放锁#########");
            zkClient.close();
        }
    }

}
